package com.cotasul.persistencia;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.cotasul.bean.CotacaoBean;
import com.cotasul.bean.FormaPagamentoBean;
import com.cotasul.bean.FornecedorBean;
import com.cotasul.bean.ItemOrcamentoBean;
import com.cotasul.persistencia.config.GerenciadorConexao;
import com.cotasul.persistencia.config.SQLConfiguracao;
import com.cotasul.persistencia.enums.EnumCondicao;
import com.cotasul.persistencia.interfaces.ICotacaoDao;

public class CotacaoDao<P extends CotacaoBean> extends DaoGenerico<P> implements
		ICotacaoDao<P> {

	@Override
	public String procuraPorParam(String tabela, String campo, String valor,
			EnumCondicao condicao) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void alterar(P p) throws Exception {
		// TODO Auto-generated method stub

	}

	@Override
	public Map<String, Long> salvar(P p) throws Exception {
		long codCota = 0;
		Map<String, Long> retorno = new HashMap<String, Long>();
		try {
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_cotacao_forne");
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			ps.setLong(1, p.getItemOrcamento().getNumero());
			ps.setLong(2, p.getFornecedor().getCodigo());
			rs = ps.executeQuery();
			if (rs.next()) {
				query = SQLConfiguracao.getInstance()
						.getValor("altera_cotacao");
				ps = conn.prepareStatement(query);
				ps.setDouble(1, p.getValorUnitario());
				ps.setString(2, p.getObservacao());
				ps.setLong(3, p.getFormaPagamento().getIdFormaPag());
				ps.setString(4, p.getTipoFrete());
				ps.setString(5, p.getPrazoEntrega());
				ps.setBytes(6, p.getImagemProd());
				ps.setString(7, p.getMarca());
				ps.setLong(8, rs.getLong("IDCOTA"));
				ps.execute();
				conn.commit();
				retorno.put("UPDATE", rs.getLong("IDCOTA"));
			} else {
				query = SQLConfiguracao.getInstance().getValor(
						"localiza_max_cotacao");
				ps = conn.prepareStatement(query);
				rs = ps.executeQuery();
				if (rs.next()) {
					codCota = rs.getLong("MAXCOD");
				}
				query = SQLConfiguracao.getInstance()
						.getValor("insere_cotacao");
				ps = conn.prepareStatement(query);
				ps.setLong(1, codCota);
				ps.setLong(2, p.getItemOrcamento().getNumero());
				ps.setLong(3, p.getFornecedor().getCodigo());
				ps.setDouble(4, p.getValorUnitario());
				ps.setString(5, p.getObservacao());
				ps.setLong(6, p.getFormaPagamento().getIdFormaPag());
				ps.setString(7, p.getTipoFrete());
				ps.setString(8, p.getPrazoEntrega());
				ps.setTimestamp(9, new Timestamp(new Date().getTime()));
				ps.setBytes(10, p.getImagemProd());
				ps.setString(11, p.getMarca());
				ps.execute();
				conn.commit();
				retorno.put("INSERT", codCota);
			}

		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}
		return retorno;
	}

	@SuppressWarnings("unchecked")
	public List<P> buscaCotacoes(P p) throws Exception {
		List<P> listaCotacoes = new ArrayList<P>();
		FornecedorBean fornecedor = null;
		FormaPagamentoBean forma = null;
		CotacaoBean cotacao = null;
		ItemOrcamentoBean itemOrcamento = null;
		try {
			query = SQLConfiguracao.getInstance().getValor("localiza_cotacoes");
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			ps.setLong(1, p.getItemOrcamento().getNumero());
			rs = ps.executeQuery();
			while (rs.next()) {
				fornecedor = new FornecedorBean();
				fornecedor.setCnpj(rs.getString("CNPJ"));
				fornecedor.setCodigo(rs.getLong("IDFORNE"));
				fornecedor.setContato(rs.getString("CONTATO"));
				fornecedor.setEmail(rs.getString("EMAIL"));
				fornecedor.setFone(rs.getString("FONE"));
				fornecedor.setFone2(rs.getString("FONE2"));
				fornecedor.setNome(rs.getString("RAZAO"));
				cotacao = new CotacaoBean();
				cotacao.setCodigo(rs.getLong("IDCOTA"));
				cotacao.setFornecedor(fornecedor);
				cotacao.setObservacao(rs.getString("OBSERVACAO"));
				cotacao.setValorUnitario(rs.getDouble("VALORUNI"));
				cotacao.setTipoFrete(rs.getString("TIPO_FRETE"));
				cotacao.setPrazoEntrega(rs.getString("PRAZO_ENTREGA"));
				cotacao.setImagemProd(rs.getBytes("IMAGEMPRO"));
				cotacao.setMarca(rs.getString("MARCA"));
				itemOrcamento = new ItemOrcamentoBean();
				itemOrcamento.setNumero(rs.getLong("IDITEMORCA"));
				cotacao.setItemOrcamento(itemOrcamento);
				forma = new FormaPagamentoBean();
				forma.setFormaPag(rs.getString("FORMA_PAGAMENTO").trim());
				forma.setMetodoPag(rs.getString("METODO_PAGAMENTO").trim());
				cotacao.setFormaPagamento(forma);
				listaCotacoes.add((P) cotacao);
			}
		} catch (Exception e) {
			throw e;
		}
		return listaCotacoes;
	};

	public void aprovaCotacao(P p) throws Exception {
		query = SQLConfiguracao.getInstance().getValor("aprova_cotacao");
		conn = GerenciadorConexao.getConexao();
		try {
			ps = conn.prepareStatement(query);
			ps.setLong(1, p.getFornecedor().getCodigo());
			ps.setDouble(2, p.getValorUnitario());
			ps.setLong(3, p.getItemOrcamento().getNumero());
			ps.execute();
			conn.commit();

			query = SQLConfiguracao.getInstance().getValor(
					"localiza_total_aberto_fechado");
			ps = conn.prepareStatement(query);
			ps.setLong(1, p.getItemOrcamento().getNumero());
			ps.setLong(2, p.getItemOrcamento().getNumero());
			rs = ps.executeQuery();
			if (rs.next()) {
				int aberto = 0;
				int fechado = 0;
				fechado = rs.getInt("TOTAL");
				rs.next();
				aberto = rs.getInt("TOTAL");
				if (aberto == 0) {
					query = SQLConfiguracao.getInstance().getValor(
							"altera_status_orcamento");
					ps = conn.prepareStatement(query);
					ps.setString(1, "Encerrado");
					ps.setLong(2, p.getItemOrcamento().getNumero());
					ps.execute();
					conn.commit();
				} else if (aberto == fechado
						|| (aberto != fechado && fechado != 0)) {
					query = SQLConfiguracao.getInstance().getValor(
							"altera_status_orcamento");
					ps = conn.prepareStatement(query);
					ps.setString(1, "Parcial");
					ps.setLong(2, p.getCodigo());
					ps.execute();
					conn.commit();
				}

			}

		} catch (Exception e) {
			throw e;
		} finally {
			fecharRecursos(ps, rs);
		}
	};

	@Override
	public void exluir(P p) throws Exception {
		// TODO Auto-generated method stub

	}

	@Override
	public void preSalvar(P p) {
		// TODO Auto-generated method stub

	}

	@Override
	public void aprovarCotacaoFornecedor(List<CotacaoBean> cotacoes)
			throws Exception {

		conn = GerenciadorConexao.getConexao();
		query = SQLConfiguracao.getInstance().getValor("aprova_cotacao");

		for (CotacaoBean cotacao : cotacoes) {
			ps = conn.prepareStatement(query);
			ps.setLong(1, cotacao.getFornecedor().getCodigo());
			ps.setDouble(2, cotacao.getValorUnitario());
			ps.setLong(3, cotacao.getItemOrcamento().getNumero());
			ps.execute();
			conn.commit();
		}

	}

	
}
